package com.sacfa.commons.bo;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Collection;

import org.apache.log4j.Logger;

import com.sacfa.commons.beans.Telefono;
import com.sacfa.commons.beans.Opcion;
import com.sacfa.commons.connection.PoolConexion;
import com.sacfa.commons.sql.TelefonoSQL;
import com.sacfa.commons.utilities.SACFAExceptions;

/**
 * @author Leizar Zar
 * @version 1.0
 * @created 11-ago-2013
 */
public class TelefonoBo {
private static Logger log = Logger.getLogger(TelefonoBo.class);
	
	public int registrar(Telefono Telefono, Connection conex){
		int idTelefono = 0;
		PreparedStatement stm = null;
		ResultSet rs = null;
		
		try {
			stm = conex.prepareStatement(TelefonoSQL.INSERT, Statement.RETURN_GENERATED_KEYS);
			stm.setString(1, Telefono.getNumero());
			stm.setInt(2, Telefono.getTipoTelefono().getId());
			stm.executeUpdate();
			
			rs = stm.getGeneratedKeys();
			rs.next();
			idTelefono = rs.getInt(1);
		} catch(SQLException ex) {
			log.info("Error SQL", ex);
			throw new SACFAExceptions("Error SQL", ex);
		}
		return idTelefono;
	}
	
	public void registrarTelefonoCliente(int idCliente, int idTelefono, Connection conex){
		PreparedStatement stm = null;
				
		try {
			stm = conex.prepareStatement(TelefonoSQL.INSERT_CLIENTE);
			stm.setInt(1, idCliente);
			stm.setInt(2, idTelefono);
			stm.executeUpdate();
		} catch(SQLException ex) {
			log.info("Error SQL", ex);
			throw new SACFAExceptions("Error SQL", ex);
		}
	}
	
	public void registrarTelefonoProveedor(int idProveedor, int idTelefono){
		PreparedStatement stm = null;
		Connection conex = PoolConexion.getInstance().getConexion();
		
		try {
			PoolConexion.getInstance().beginTransaction(conex);
			
			stm = conex.prepareStatement(TelefonoSQL.INSERT_PROVEEDOR);
			stm.setInt(1, idProveedor);
			stm.setInt(2, idTelefono);
			stm.executeUpdate();
			
			PoolConexion.getInstance().commit(conex);
			PoolConexion.getInstance().endTransaction(conex);
		} catch(SQLException ex) {
			log.info("Error SQL", ex);
			throw new SACFAExceptions("Error SQL", ex);
		} finally {
			PoolConexion.getInstance().endConection(conex);
		}
	}
	
	public void registrarTelefonoEmpleado(int idEmpleado, int idTelefono, Connection conex){
		PreparedStatement stm = null;
		
		try {
			stm = conex.prepareStatement(TelefonoSQL.INSERT_EMPLEADO);
			stm.setInt(1, idEmpleado);
			stm.setInt(2, idTelefono);
			stm.executeUpdate();
		} catch(SQLException ex) {
			log.info("Error SQL", ex);
			throw new SACFAExceptions("Error SQL", ex);
		} 
	}

	public Telefono consultar(Telefono Telefono){
		Opcion opcion = new Opcion();
		PreparedStatement stm = null;
		ResultSet rs = null;
		Connection conex = PoolConexion.getInstance().getConexion();
		
		try {
			stm = conex.prepareStatement(TelefonoSQL.SELECT_ONE);
			stm.setInt(1, Telefono.getId());
			rs = stm.executeQuery();
			
			rs.next();
			Telefono.setId(rs.getInt(1));
			Telefono.setNumero(rs.getString(2));
			opcion.setId(rs.getInt(3));
			Telefono.setTipoTelefono(opcion);
		} catch(SQLException ex) {
			log.info("Error SQL", ex);
			throw new SACFAExceptions("Error SQL", ex);
		} finally {
			PoolConexion.getInstance().endConection(conex);
		}
		return Telefono;
	}
	
	public Collection<Telefono> consultaTelefonoCliente(int idCliente){
		Collection<Telefono> telefonos = new ArrayList<Telefono>();
		Telefono Telefono = new Telefono();
		Opcion opcion = new Opcion();
		PreparedStatement stm = null;
		ResultSet rs = null;
		Connection conex = PoolConexion.getInstance().getConexion();
		
		try {
			stm = conex.prepareStatement(TelefonoSQL.SELECT_ALL_CLIENTE);
			stm.setInt(1, idCliente);
			rs = stm.executeQuery();
			
			while(rs.next()){
				Telefono.setId(rs.getInt(1));
				Telefono.setNumero(rs.getString(2));
				opcion.setId(rs.getInt(3));
				Telefono.setTipoTelefono(opcion);
				telefonos.add(Telefono);
			}
		} catch(SQLException ex) {
			log.info("Error SQL", ex);
			throw new SACFAExceptions("Error SQL", ex);
		} finally {
			PoolConexion.getInstance().endConection(conex);
		}
		return telefonos;
	}
	
	public Collection<Telefono> consultaTelefonoProveedor(int idProveedor){
		Collection<Telefono> telefonos = new ArrayList<Telefono>();
		Telefono Telefono = new Telefono();
		Opcion opcion = new Opcion();
		PreparedStatement stm = null;
		ResultSet rs = null;
		Connection conex = PoolConexion.getInstance().getConexion();
		
		try {
			stm = conex.prepareStatement(TelefonoSQL.SELECT_ALL_PROVEEDOR);
			stm.setInt(1, idProveedor);
			rs = stm.executeQuery();
			
			while(rs.next()){
				Telefono.setId(rs.getInt(1));
				Telefono.setNumero(rs.getString(2));
				opcion.setId(rs.getInt(3));
				Telefono.setTipoTelefono(opcion);
				telefonos.add(Telefono);
			}
		} catch(SQLException ex) {
			log.info("Error SQL", ex);
			throw new SACFAExceptions("Error SQL", ex);
		} finally {
			PoolConexion.getInstance().endConection(conex);
		}
		return telefonos;
	}
	
	public Collection<Telefono> consultaTelefonoEmpleado(int idEmpleado){
		Collection<Telefono> telefonos = new ArrayList<Telefono>();
		Telefono Telefono = new Telefono();
		Opcion opcion = new Opcion();
		PreparedStatement stm = null;
		ResultSet rs = null;
		Connection conex = PoolConexion.getInstance().getConexion();
		
		try {
			stm = conex.prepareStatement(TelefonoSQL.SELECT_ALL_EMPLEADO);
			stm.setInt(1, idEmpleado);
			rs = stm.executeQuery();
			
			while(rs.next()){
				Telefono.setId(rs.getInt(1));
				Telefono.setNumero(rs.getString(2));
				opcion.setId(rs.getInt(3));
				Telefono.setTipoTelefono(opcion);
				telefonos.add(Telefono);
			}
		} catch(SQLException ex) {
			log.info("Error SQL", ex);
			throw new SACFAExceptions("Error SQL", ex);
		} finally {
			PoolConexion.getInstance().endConection(conex);
		}
		return telefonos;
	}
	
	public void modificar(Telefono Telefono){
		PreparedStatement stm = null;
		Connection conex = PoolConexion.getInstance().getConexion();
		
		try {
			PoolConexion.getInstance().beginTransaction(conex);
			
			stm = conex.prepareStatement(TelefonoSQL.UPDATE);
			stm.setString(1, Telefono.getNumero());
			stm.setInt(2, Telefono.getTipoTelefono().getId());
			stm.executeUpdate();
			
			PoolConexion.getInstance().commit(conex);
			PoolConexion.getInstance().endTransaction(conex);
		} catch(SQLException ex) {
			log.info("Error SQL", ex);
			throw new SACFAExceptions("Error SQL", ex);
		} finally {
			PoolConexion.getInstance().endConection(conex);
		}
	}
	
	public void eliminar(Telefono Telefono){
		PreparedStatement stm = null;
		Connection conex = PoolConexion.getInstance().getConexion();
		
		try {
			PoolConexion.getInstance().beginTransaction(conex);
			
			stm = conex.prepareStatement(TelefonoSQL.DELETE);
			stm.setInt(1, Telefono.getId());
			stm.executeUpdate();
			
			PoolConexion.getInstance().commit(conex);
			PoolConexion.getInstance().endTransaction(conex);
		} catch(SQLException ex) {
			log.info("Error SQL", ex);
			throw new SACFAExceptions("Error SQL", ex);
		} finally {
			PoolConexion.getInstance().endConection(conex);
		}
	}
	
	public void eliminarTelefonoCliente(int idCliente, int idEmail){
		PreparedStatement stm = null;
		Connection conex = PoolConexion.getInstance().getConexion();
		
		try {
			PoolConexion.getInstance().beginTransaction(conex);
			
			stm = conex.prepareStatement(TelefonoSQL.DELETE_CLIENTE);
			stm.setInt(1, idCliente);
			stm.setInt(2, idEmail);
			stm.executeUpdate();
			
			PoolConexion.getInstance().commit(conex);
			PoolConexion.getInstance().endTransaction(conex);
		} catch(SQLException ex) {
			log.info("Error SQL", ex);
			throw new SACFAExceptions("Error SQL", ex);
		} finally {
			PoolConexion.getInstance().endConection(conex);
		}
	}
	
	public void eliminarTelefonoProveedor(int idProvedoor, int idEmail){
		PreparedStatement stm = null;
		Connection conex = PoolConexion.getInstance().getConexion();
		
		try {
			PoolConexion.getInstance().beginTransaction(conex);
			
			stm = conex.prepareStatement(TelefonoSQL.DELETE_PROVEEDOR);
			stm.setInt(1, idProvedoor);
			stm.setInt(2, idEmail);
			stm.executeUpdate();
			
			PoolConexion.getInstance().commit(conex);
			PoolConexion.getInstance().endTransaction(conex);
		} catch(SQLException ex) {
			log.info("Error SQL", ex);
			throw new SACFAExceptions("Error SQL", ex);
		} finally {
			PoolConexion.getInstance().endConection(conex);
		}
	}
	
	public void eliminarTelefonoEmpleado(int idEmpleado, int idEmail){
		PreparedStatement stm = null;
		Connection conex = PoolConexion.getInstance().getConexion();
		
		try {
			PoolConexion.getInstance().beginTransaction(conex);
			
			stm = conex.prepareStatement(TelefonoSQL.DELETE_EMPLEADO);
			stm.setInt(1, idEmpleado);
			stm.setInt(2, idEmail);
			stm.executeUpdate();
			
			PoolConexion.getInstance().commit(conex);
			PoolConexion.getInstance().endTransaction(conex);
		} catch(SQLException ex) {
			log.info("Error SQL", ex);
			throw new SACFAExceptions("Error SQL", ex);
		} finally {
			PoolConexion.getInstance().endConection(conex);
		}
	}
}